package com.sy.util;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie操作相关的工具类
 */
@Component
public class CookieOperations {
    /**
     * 为了防止Cookie的路径所带来的问题，在项目中统一将Cookie的路径设置为/
     */
    private static final String COOKIE_ROOT_PATH = "/";
    /**
     * Cookie为0的生存时间，即删除Cookie
     */
    private static final int COOKIE_MIN_AGE = 0;

    @Autowired
    private HttpServletRequest req;

    @Autowired
    private HttpServletResponse res;

    /**
     * 设置Cookie
     * @param name Cookie的名字
     * @param value Cookie的值
     * @param age 过期时间
     */
    public void set(String name, String value, int age) {
        Cookie cookie = new Cookie(name, value);
        cookie.setPath(COOKIE_ROOT_PATH);
        if (age == COOKIE_MIN_AGE) {
            throw new IllegalArgumentException("设置的Cookie生存时间不能为0");
        }
        res.addCookie(cookie);
    }

    /**
     * 根据Cookie的名字获取Cookie的值
     * @param name Cookie的名字
     * @return Cookie的值
     */
    public String get(String name) {
        Cookie[] cookies = req.getCookies();
        if (!ArrayUtils.isEmpty(cookies)) {
            for (Cookie cookie : cookies) {
                if (StringUtils.equals(name, cookie.getName())) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

    /**
     * 因为在过滤器中使用的使用，如果对象是通过@Autowired注入的
     * 则此时的对象是通过ThreadLocal和当前线程绑定的，因此无法在过滤器环境中使用
     * 因为过滤器本身不是SpringBean对象
     * @param req
     * @param name
     * @return
     */
    public String get(HttpServletRequest req, String name) {
        Cookie[] cookies = req.getCookies();
        return getCookieByName(cookies, name);
    }

    private String getCookieByName(Cookie cookies[], String name) {
        if (!ArrayUtils.isEmpty(cookies)) {
            for (Cookie cookie : cookies) {
                if (StringUtils.equals(name, cookie.getName())) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

    /**
     * 删除指定name的Cookie
     * @param name 要删除的Cookie的名字
     */
    public void del(String name) {
        Cookie[] cookies = req.getCookies();
        if (!ArrayUtils.isEmpty(cookies)) {
            for (Cookie cookie : cookies) {
                if (StringUtils.equals(name, cookie.getName())) {
                    cookie.setMaxAge(COOKIE_MIN_AGE);
                    cookie.setPath(COOKIE_ROOT_PATH);
                    res.addCookie(cookie);
                }
            }
        }
    }
}
